In [1]:
%matplotlib inline
import os
import numpy as np
import matplotlib as mpl
import matplotlib.style
mpl.style.use('classic')
import matplotlib.pyplot as plt
from matplotlib.text import Text
from matplotlib.patches import Circle, Rectangle, RegularPolygon
from matplotlib.collections import PatchCollection
from IPython.display import display, Image, Latex, SVG, HTML
from copy import copy
In [2]:
from cana.datasets.bio import THALIANA, DROSOPHILA, BUDDING_YEAST
In [3]:
N = THALIANA()
#N = DROSOPHILA()
#N = BUDDING_YEAST()
print(N)
In [4]:
if N.name == 'Arabidopsis Thaliana':
foldername = 'thaliana'
elif N.name == 'Drosophila Melanogaster':
foldername = 'drosophila'
elif N.name == 'Budding Yeast Cell Cycle':
foldername = 'yeast'
In [5]:
def plot_look_up_table(nid, n):
# Init values from BooleanNode
k = n.k if n.k>=1 else 1
inputs = n.inputs if not n.constant else [n.name]
LUT = n.look_up_table().sort_index(ascending=False)
# Count number of F in the LUT
n_fs = LUT.shape[0]
# Schemata Cell Width and spacing
cwidth = 60.
cxspace = 0
cyspace = 6
border = 1
sepcxspace = 21
sepcyspace = 15
dpi = 150.
# Margins
top, right, bottom, left, hs = 120, 25, 25, 60, 25
# Axes Width & Height
ax1width = ((k*(cwidth+cxspace))+sepcxspace+(cwidth))
ax1height = (n_fs*(cwidth+cyspace)-cyspace)
# Figure Width & Height
fwidth = (left + ax1width + hs + right)
fheight = (bottom + ax1height + top)
# Percentages for Axes location
_ax1w = ((ax1width*100) / fwidth) / 100
_ax1h = ((ax1height*100) / fheight) / 100
_bottom = ((bottom*100) / fheight) / 100
_left = ((left*100) / fwidth) / 100
_hs = ((hs*100) / fwidth) / 100
# Init Figure
fig = plt.figure(figsize=(fwidth/dpi,fheight/dpi), facecolor='w', dpi=dpi)
ax1 = fig.add_axes((_left,_bottom,_ax1w,_ax1h), aspect=1, label='LUT')
### LUT Plot ###
yticks = []
patches = []
x,y = 0.,0.
#
for i,r in LUT.iterrows():
ins = str(r['In:'])
out = r['Out:']
x = 0.
xticks = []
for input in ins:
if input == '0':
facecolor = 'white'
textcolor = 'black'
elif input == '1':
facecolor = 'black'
textcolor = 'white'
text = '%s'%(input)
ax1.add_artist(Text(x+cwidth/2,y+cwidth/10*4, text=text, color=textcolor, va='center', ha='center',fontsize=14,family='serif'))
r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor=facecolor, edgecolor='black')
patches.append(r)
xticks.append(x+cwidth/2)
x += cwidth + cxspace
x += sepcxspace
r = Rectangle((x,y), width=cwidth, height=cwidth, facecolor='black' if (out==1) else 'white', edgecolor='black')
ax1.add_artist(Text(x-(sepcxspace/2)-(cxspace/2),y+cwidth/10*4, text=':', color='black', va='center', ha='center',fontsize=14,weight='bold',family='serif'))
ax1.add_artist(Text(x+(cwidth/2),y+cwidth/10*4, text=out, color='white' if (out==1) else 'black', va='center', ha='center',fontsize=14,family='serif'))
patches.append(r)
xticks.append(x+cwidth/2)
yticks.append(y+cwidth/2)
y += cwidth + cyspace
#y += sepcyspace
ax1.add_collection(PatchCollection(patches,match_original=True))
#
ax1.set_yticks(yticks)
ax1.set_yticklabels([r"$f_{%d}$"%(i+1) for i in range(n_fs)[::-1]], fontsize=14)
ax1.set_xticks(xticks)
ax1.set_xticklabels(inputs + ['%s'%(n.name)], rotation=90, fontsize=14)
#
ax1.xaxis.tick_top()
# Remove Tick
ax1.tick_params(which='major',pad=7)
for tic in ax1.xaxis.get_major_ticks():
tic.tick1On = tic.tick2On = False
for tic in ax1.yaxis.get_major_ticks():
tic.tick1On = tic.tick2On = False
# Remove Border
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
ax1.spines['bottom'].set_visible(False)
ax1.spines['left'].set_visible(False)
# Limits
ax1.set_xlim(-border,ax1width+border)
ax1.set_ylim(-border,ax1height+border)
#ax1.invert_yaxis()
# FileName
filename = n.name
filename = filename.replace('/','_')
filename = filename.replace(',','_')
## Display
display(fig)
## Save to file
#plt.savefig('%s/../experiments/2017 - BioModels/%s/LUT/%s-%s' % (os.getcwd(), foldername, nid, filename), dpi=dpi)
plt.close()
In [6]:
for nid,n in enumerate(N.nodes):
display(HTML('<h2>'+n.name+'</h2>'))
# Plot
plot_look_up_table(nid,n)
break
In [ ]: